package enemies;

import mapControl.GraphicsMapControl;
import net.datastructures.Position;

import com.jmex.audio.AudioSystem;
import com.jmex.audio.AudioTrack;
import com.jmex.audio.AudioTrack.TrackType;

import elementos.Elemento;
import enemies.strategy.Strategy;

/**
 * Clase que representa objetos enemigo del juego
 * @author Sebastian Giulietti 69032 
 * @author Adrian Sanchez 64251
 * 
 */
public class Enemy extends Elemento implements Runnable {

	private boolean live;
	
	//controlador del mapa
	GraphicsMapControl mapControl;
	
	//Puntaje que otorgara la muerte del enemigo
	private int score;
	
	//Estrategia que usara el enemigo
	private Strategy strategy;

	
	public int getScore()
	{
		return score;
	}
	
	public void setScore(int score) {
		this.score = score;
	}
	/*
	 * Contructor principal	 
	 * @param GraphicsMapControl mapControl
	 */
	public Enemy(GraphicsMapControl mapControl) {
		this.mapControl = mapControl;
		mapControl.getRootNode().attachChild(node);
		live = true;
	}

	// Metodo que pone en marcha la estrategia, devuelve un booleno que dice si el enemigo murio 
	public boolean executeStrategy() {
		return strategy.execute();

	}

	//True si el enemigo esta vivo, False caso contrario
	public boolean getLive() {
		return live;
	}

	//Efectua la accion de morir, inicia el sonido del grito y quita el enemigo del mapa
	public void kill() {
		live = false;
		AudioSystem audio = AudioSystem.getSystem();
		AudioTrack targetSound = audio.createAudioTrack(getClass().getResource(
				"/music/cry.wav"), false);
		targetSound.setVolume(1.0f);
		targetSound.play();
		mapControl.removeEnemy(this);


		targetSound.setVolume(1.0f);
		targetSound.setType(TrackType.POSITIONAL);
		targetSound.setRelative(true);
		targetSound.setWorldPosition(node.getWorldTranslation());
		mapControl.incScore(score);

	}
	//Posiciona al enemigo en una celda dada del tablero
	public void locate(int row, int col) {
		this.setRow(row);
		this.setCol(col);
		node.setLocalTranslation(mapControl.getTraslationCentrada(row, col));
		mapControl.getCelda(row, col).addEnemy(this);
	}

	//Inicia el proceso de movimiento del enemigo hacia la posicion dada
	public void moverA(int row, int col) {

		int lastRow = getRow();
		int lastCol = getCol();

		this.setRow(row);
		this.setCol(col);
		node.setLocalTranslation(mapControl.getTraslationCentrada(row, col));

		mapControl.getCelda(lastRow, lastCol).removeEnemy(this);
		
		mapControl.getCelda(row, col).addEnemy(this);
		
		if (mapControl.getCelda(row, col).getPlayer() != null) {
			mapControl.getCelda(row, col).getPlayer().kill();
		}

	}

	@Override
	//Inicia el hilo que representa la vida del enemigo
	public void run() {
		while (live) {
			try {
				live = executeStrategy();
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
	//Setea el boleano que determina si el enemigo esta vivo o no
	public void setLive(boolean live) {
		this.live = live;
	}

	//Setea la estrategia que usara el enemigo para intentar atrapar a bomberman
	public void setStrategy(Strategy strategy) {
		this.strategy = strategy;

	}

}